#!/usr/bin/php -q 
<?php

  
  
	error_reporting(E_ALL); // выводим все ошибки
  set_time_limit(300); // увеличиваем время выполнения скрипта
  register_shutdown_function('shutdown');

	session_start();
  		
	//include core files
  chdir('/home/www/z182452/htdocs/');
	include("./cfg/connect.inc.php");
	include("./includes/database/mysql.php");
	include("./cfg/functions.php");
  chdir('/home/www/z182452/htdocs/grabber');

	//connect to the database
	db_connect(DB_HOST,DB_USER,DB_PASS) or die (db_error());
	db_select_db(DB_NAME) or die (db_error());
  db_query("SET NAMES 'utf8';") or die(db_error());

	// Подключим свою библиотеку для работы с freestyledist.ru
	include_once("./tools/yandexParser.php");
		
  //Считываем GET-переменные
  // word             - статистика по конкретному слову
  // wAmount = 10     - порцию слов из справочника
  // minQ    = 5000   - минимальное число запросов для записи в словарь
   $word=null;
		if(isset($_GET["word"])) {
			$word = $_GET["word"];
      echo "<p>We'll try word = ".$word."</p>";
		}
    
    if(isset($_GET["wAmount"])){
      $wAmount  = $_GET["wAmount"];
      echo "Depth = $wAmount <br>";
    }else{
      $wAmount = 10; 
    }
    
    if(isset($_GET["minQ"])){
      $minQ = $_GET["minQ"];
      echo "States minimum = $minQ <br>";
    }else{
      $minQ = 5000;
    }
    
    if(isset($_GET["DEBUGING"])){
      $DEBUGING = $_GET["DEBUGING"];
    }else{
      $DEBUGING=false;
    }
    
    $time_start_all = microtime(1);
      
    writeLog('task_begin', "word=$word&wAmount=$wAmount&minQ=$minQ&DEBUGING=$DEBUGING");
    
  /*  echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          <html xmlns="http://www.w3.org/1999/xhtml">
          <head>
          	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
          </head><body>';
    */
    
    // Если нужно какое-то конкретное слово, то это дебагинг
    // Нужно просто проверить наличие слова в словаре
    // Если его там нет, то записать
    // Сделать вывод из словаря
    
    
    
    if ($DEBUGING) echo "mem = ".number_format(memory_get_usage()) . "<br>";
    
    // инициализируем сетевые классы
    $wst = new Wordstats;
    $yad = new yaAds();
    
    //Выберем режим. Если передано конкретное слово, то обновим информацию только для него, если же не передано, то запустим следующую порцию слов из справочника в обработку
    if(isset($word)){ 
      word_info($word);
    }else{
      // цикл по следующим $wAmount словам
      $q_pack = db_query("SELECT words FROM grab_queries where wst_flag IS NULL OR wst_flag = 0 LIMIT $wAmount") or die (db_error());
      if( $row_pack=db_fetch_row($q_pack) ){
          //$word_time=0;
          //$word_time_start = microtime(1);
          word_info($row_pack[0]);
          //$word_time_end = microtime(1);
          //$word_time = $word_time + $word_time_end - $word_time_start;
          //echo "Word_info time $word_time seconds<br>";
          while($row_pack=db_fetch_row($q_pack)){
            //$word_time=0;
            //$word_time_start = microtime(1);
            word_info($row_pack[0]);
            //$word_time_end = microtime(1);
            //$word_time = $word_time + $word_time_end - $word_time_start;
            //echo "Word_info time $word_time seconds<br>";
          }
      }else{
        //сообщить, что больше нет таких
        echo "There are no more!<br>";
        send_mes("There are no more!<br>");
      }
            
    }
    
    
    //////////////////////////////////////////////
    ////////// Functions /////////////////////////
    //////////////////////////////////////////////
    
    function word_info($word){
      global $DEBUGING;
      global $minQ;
      global $wst;
      global $yad;
        
      if(isset($word)){
        
        $word_desc = array();
        $word_desc = word_select($word);
        
        // Если нет статов, то надо всю ветку обновлять
        if(!isset($word_desc['wst_flag']) || $word_desc['wst_flag'] == 0){
        
          writeLog('word_proccesing',"$word");
          
          
          $word_id=NULL;
          //Вытащим весь список в том, числе наш
          
          $upsert_time=0;
          $ads_time=0;
          
          if ($DEBUGING) echo "mem before cycles = ".number_format(memory_get_usage()) . "<br>";
          
          $p=1;
          while($p<=20) {
              $stats_array = $wst->getWst($word,$p);
              // Если статистики нет вообще, то и слово не нужно
              // А так же, если статистика есть, но для самого слова нет
              if ((count($stats_array) == 0 || !array_key_exists($word, $stats_array['direct'])) && $p==1) {
                db_query("DELETE FROM grab_queries WHERE words='".$word."'");
                writeLog('deleting ',"$word");
                break 1;
              } 
            
              foreach ($stats_array as $stage=>$words){
                //Связанные запросы берем только с первой таблицы
                if($stage=='direct' || $p==1){
                    foreach($words as $key=>$cnt){
                      
                      
          
                      if ($DEBUGING) echo "each step mem = ".number_format(memory_get_usage()) . "<br>";
                      
                      //Посчитаем кол-во объявлений
                      $ads_time_start = microtime(1);
                      $ads=$yad->countAds($key);
                      $ads_time_end = microtime(1);
                      $ads_time = $ads_time + $ads_time_end - $ads_time_start;
                      
                      //Запишем словарь
                      $upsert_time_start = microtime(1);
                      upsert($key,$cnt,$ads,$word_id,$stage);
                      $upsert_time_end = microtime(1);
                      $upsert_time = $upsert_time + $upsert_time_end - $upsert_time_start;
                      
                      // Заканчиваем цикл, если пошли очень мелкие слова
                      if($stage == 'direct' && $cnt < $minQ) break 3;
                      
          
                      // Для основного слова теперь можно узнать ИД
                      if(!isset($word_id)){
                          $q_word = db_query("SELECT ID FROM grab_queries where words='$word'") or die (db_error());
                          if($row_word=db_fetch_row($q_word)){
                            $word_id = $row_word[0];
                          }
                      }
          
                    }
                }
              }
              $p++;
          }
          //echo "Upsert time $upsert_time seconds<br>";
          //echo "Ads time $ads_time seconds<br>";
        }
        //echo "Done!<br>";
        writeLog('word_end',"$word");  
      }
    }
    
    
		
    
    function writeLog($event,$description){
        $i_str = "INSERT INTO grab_log(event,description) VALUES('$event','$description');";
        db_query($i_str) or die(db_error());
    }    
    
    function ThrowMe($mess, $code){
        echo 'throws <br>';
        throw new Exception($mess, $code);
    }
    
    function word_select($w){
      global $DEBUGING;
      
      $w_desc=NULL;
      
      if ($DEBUGING)  echo "selecting $w <br>";
      $q_word = db_query("SELECT words, cnt_wst, cnt_dir,parentID,connectedID,wst_flag FROM grab_queries where words='".$w."'") or die (db_error());
      if($row_word=db_fetch_row($q_word)){
        $w_desc=array();
        $w_desc['words']=$row_word[0];
        $w_desc['cnt_wst']=$row_word[1];
        $w_desc['cnt_dir']=$row_word[2];
        $w_desc['parentID']=$row_word[3];
        $w_desc['connectedID']=$row_word[4];
        $w_desc['wst_flag']=$row_word[5];
      }
      return $w_desc; 
    }
    
    //функция для обновления справочника запросов
    //проверяет, есть ли такое слово и вставляет его или обновляет уже существующее
    //в зависимости от $stage, проставляет ид парента или связанного слова
    //обновляет флаги
    function upsert($key,$states,$ads,$main_word_id,$stage){
      global $DEBUGING;
      
      $parID='NULL';
      $conID='NULL';
      if(isset($main_word_id) && $main_word_id!=null){
        if($stage=='direct') {
          $parID=$main_word_id;
        }else{
          $conID=$main_word_id;
        }
      }
       
      if ($DEBUGING) echo "updating $key <br>";
      $q = db_query("UPDATE grab_queries SET cnt_wst=$states, cnt_dir=$ads, wst_flag=1 WHERE words='$key'") or die (db_error());
      
      if(mysql_affected_rows() == 0) { 

        $i_str = "INSERT INTO grab_queries(words,cnt_wst,cnt_dir,parentID,connectedID,wst_flag) VALUES('$key',$states,$ads,$parID,$conID,1);";
        if ($DEBUGING) echo "inserting $i_str <br>";
        db_query($i_str) or die(db_error());
      }
    }
    
    function shutdown()
    {
        if (!defined('DIE_NOT_CALLED'))
        {
            // Script was canceled by die()       
            writeLog('task_error',"");
            send_mes("Errors!");
        }
    }
    
    function send_mes($text){
      
      $headers="";
      $owner_email = iconv('UTF-8', 'windows-1251',"alche8411@gmail.com"); 
      $headers .= 'Content-type: text/plain; \n\t charset="windows-1251"' . "\r\n";
      $subject = 'A message from your grabber!'; 
      
      $messageBody = ""; 
       
      $messageBody .= "<p>$text</p>"; 
       
      $messageBody = strip_tags($messageBody); 

  
      try{ 
          if(!mail($owner_email, $subject, $messageBody, $headers)){ 
              throw new Exception('mail failed'); 
          }else{ 
              echo 'mail sent'; 
          } 
      }catch(Exception $e){ 
          echo $e->getMessage() ."\n"; 
      } 
    }    
    
    writeLog('task_end',"");
    
    $time_end_all = microtime(1);
    
    $script_time = $time_end_all - $time_start_all; 
    //echo "Script time $script_time seconds<br>";
    
    // since we reached this point, die was not called
    define('DIE_NOT_CALLED', true);

?>
